// 1. Promise是一个构造函数，既然是构造函数，那么我们能new
// Promise() 得到一个对象
// 2. 在Promise上有两个函数：reject 和resolve；reject是失败后的回调函数
// resolve是成功后的回调函数
// 3. 在Promise 构造函数额Prototype 属性上，有一个.thn()方法，也就是说，
// 只要是Promise构造函数创建的实例，都能访问到.then()方法
// 4. Promise 表示一个 异步操作，每当我们new 一个Promise 的实例，这个实例，就表示一个具体的异步操作
// 5. 既然Promise 创建的实例，是一个异步操作，那么，这个异步操作的结果，只能有两种状态：
// 5.1状态1： 异步执行成功了，需要在内部调用 成功的回调函数，resolve把结果返回给调用者
// 5.2状态2： 异步执行失败了，需要在内部调用 失败的回调函数，reject把结果返回给调用者
// 5.3 由于Promise的实例，是一个异步操作，所以，内部拿到操作的结果后，无法使用return把操作
// 的结果返回给调用者，这时候，只能使用回调函数的形式，来吧成功或者失败的结果返回给调用者。
// 6. 我们可以在new 出来的Promise实例上，调用 .then()方法，[预先]为这个Promise异步操作，指定
// 成功(resolve)和失败(reject)回调函数


// 注意： 这里 new 出来的 promise，只是代表[形式上]的一个异步操作
// 什么是形式上的异步操作：就是说，我们只知道它是一个异步操作，但是做什么具体的异步事情，目前不清楚

// var promise = new Promise(function() {
// // 这个function 内部写的具体的异步操作

// })


const fs = require('fs')

// 每当 new 一个Promise实例的时候，就会立即执行这个异步操作中的代码
// 也就是说，new的时候，除了能够得到一个promise实例之外，还会立即调用我们
// 为Promise构造函数传递的那个function，执行这个function中的异步操作代码
// var promise = new Promise(function() {
// // 这个function 内部写的具体的异步操作
// fs.readFile('./files/2.txt','utf-8',(err,dataStr)=>{
// if(err) throw err
// console.log(dataStr)
// })
// })

// 初衷：给路径，返回读取到的内容
function getFileByPath(fpath) {
    var promise = new Promise(function (resolve, reject) {
        // 这个function 内部写的具体的异步操作
        fs.readFile(fpath, 'utf-8', (err, dataStr) => {
            // if(err) throw err
            // console.log(dataStr)
            if (err) return reject(err)
            resolve(dataStr)
        })
    })
    return promise
}

var p = getFileByPath('./files/2.txt')
p.then(function (data) {
    console.log(data + '----')
}, function (err) {
    console.log(err.message)
})